"""pytest配置文件"""
import pytest
import sys
import os
from unittest.mock import Mock

# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from app import create_app
from config import Config

class TestConfig(Config):
    """测试配置类"""
    TESTING = True
    # 使用config.py中的MongoDB连接字符串，但使用不同的数据库名称
    # 原始连接字符串格式：mongodb://root:Simmed%402018@192.168.1.35:19060/
    # 我们需要保留连接信息但更改数据库名称
    DATABASE_NAME = 'test_blockchain_middleware'
    JWT_SECRET_KEY = 'test-secret-key'
    SECRET_KEY = 'test-secret-key'

@pytest.fixture
def app():
    """创建测试应用实例"""
    # Mock MongoDB连接以避免实际数据库依赖
    with pytest.MonkeyPatch().context() as m:
        # 创建一个更完整的Mock对象，模拟MongoDB客户端和数据库
        mock_db = Mock()
        
        # 创建一个字典子类，它的__getitem__方法返回mock_db
        class MockMongoClient(dict):
            def __getitem__(self, key):
                return mock_db
        
        mock_mongo = MockMongoClient()
        
        m.setattr('pymongo.MongoClient', lambda *args, **kwargs: mock_mongo)
        
        # 创建应用实例
        app = create_app(TestConfig)
        
        # 使用真实的UnifiedAbstractionLayer，不进行任何mock
        # 让测试直接连接到真实的区块链网络
        # 错误处理将通过真实的适配器异常来测试
        
        # 禁用API网关的认证检查，以便测试可以不需要API密钥
        if hasattr(app, 'api_gateway') and app.api_gateway:
            # 保存原始的_is_public_endpoint方法
            original_is_public = app.api_gateway._is_public_endpoint
            
            # 创建一个新的方法，始终返回True（所有端点都是公共的）
            def mock_is_public_endpoint(endpoint):
                return True
            
            # 替换方法
            app.api_gateway._is_public_endpoint = mock_is_public_endpoint
        
        yield app

@pytest.fixture
def client(app):
    """创建测试客户端"""
    return app.test_client()

@pytest.fixture
def runner(app):
    """创建CLI测试运行器"""
    return app.test_cli_runner()